package br.com.dataphonebr.adapter;

import java.util.Date;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.text.Html;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import br.com.dataphonebr.R;
import br.com.dataphonebr.entity.Atividade;
import br.com.dataphonebr.enumerator.PeriodoNotificacao;
import br.com.dataphonebr.enumerator.StatusAtividade;
import br.com.dataphonebr.service.GenericAdapterService;
import br.com.dataphonebr.util.EnumTranslator;
import br.com.dataphonebr.util.Util;

public class AppointmentAdapter extends GenericAdapterService<Atividade> {
	
	public AppointmentAdapter(List<Atividade> list) {
		super(list);
	}

	private Util util = new Util();
	
	@Override
	public View getView(int index, View view, ViewGroup parent) {
		
		View newView = super.getView(index, view, parent, R.layout.item_appointment_row);
		Atividade atividade = getList().get(index);
		
		TextView popupBtn = getTextView(R.id.exibirDadosAdmResultBtn, newView);
		popupBtn.setTag(index);
		
		StringBuffer sbTitulo = new StringBuffer();
		sbTitulo.append("<b>").append(atividade.getTitulo()).append("</b>");

		TextView nameTextView = getTextView(R.id.txtAppTitulo, newView);
		nameTextView.setTextSize(16);
		nameTextView.setText(Html.fromHtml(sbTitulo.toString()));

		StringBuffer sbGrupo = new StringBuffer();
		sbGrupo.append("<b>").append(newView.getContext().getString(R.string.grupoLbl)).append(": ").append(atividade.getGrupo().getNome()).append("</b>");

		TextView groupTextView = getTextView(R.id.txtAppGrupo, newView);
		groupTextView.setText(Html.fromHtml(sbGrupo.toString()));

		TextView dateTextView = getTextView(R.id.txtAppData, newView);
		if (atividade.getDataIni() != null || atividade.getHoraIni() != null){
			dateTextView.setVisibility(View.VISIBLE);
			dateTextView.setText(Html.fromHtml(getLinhaPeriodo(atividade, newView.getContext())));
			dateTextView.setTextSize(14);
			if (atividade.getDataIni() != null && atividade.getHoraIni() != null){
				dateTextView.setTextSize(12);
			} 
		} else {
			dateTextView.setVisibility(View.GONE);
		}

		TextView repeticaoTextView = getTextView(R.id.txtAppRepeticao, newView);
		if (!atividade.getPeriodoNotificacao().equals(PeriodoNotificacao.NENHUM)){
			repeticaoTextView.setVisibility(View.VISIBLE);
			repeticaoTextView.setText(Html.fromHtml(getLinhaRepeticao(atividade, newView.getContext())));
		} else {
			repeticaoTextView.setVisibility(View.GONE);
		}

		TextView prioridadeTextView = getTextView(R.id.txtAppPrioridade, newView);
    	EnumTranslator.translate(atividade.getPrioridade(), newView.getContext());
		prioridadeTextView.setText(newView.getContext().getString(R.string.prioridadeLbl)+": "+atividade.getPrioridade().getLabel());

		TextView statusTextView = getTextView(R.id.txtAppStatus, newView);
    	EnumTranslator.translate(atividade.getStatus(), newView.getContext());
		statusTextView.setText(atividade.getStatus().getLabel().toUpperCase());
		statusTextView.setTextColor(Color.RED);
		statusTextView.setTypeface(null, Typeface.BOLD);

		TextView tempoTextView = getTextView(R.id.txtAppTempo, newView);
		tempoTextView.setText(Html.fromHtml(getTempo(atividade, newView.getContext())));

		if (atividade.getStatus().equals(StatusAtividade.CONCLUIDA)){
			nameTextView.setPaintFlags(nameTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
			dateTextView.setPaintFlags(nameTextView.getPaintFlags() | Paint.FAKE_BOLD_TEXT_FLAG);
			groupTextView.setPaintFlags(nameTextView.getPaintFlags() | Paint.FAKE_BOLD_TEXT_FLAG);
			statusTextView.setTextColor(Color.RED);
		}
		
		return newView;
	}
	
	protected String getLinhaRepeticao(Atividade atividade, Context context){
		StringBuffer linha = new StringBuffer();
    	if (atividade.getPeriodoNotificacao().equals(PeriodoNotificacao.POR_DIA)){
			linha.append(context.getString(R.string.all_text_2)).append(" ");
			StringBuffer sbRepeticao = new StringBuffer();
			sbRepeticao.append(atividade.getSegunda()!=null && atividade.getSegunda()?" "+context.getString(R.string.monday_lower)+",":"");
			sbRepeticao.append(atividade.getTerca()!=null && atividade.getTerca()?" "+context.getString(R.string.tuesday_lower)+",":"");
			sbRepeticao.append(atividade.getQuarta()!=null && atividade.getQuarta()?" "+context.getString(R.string.wednesday_lower)+",":"");
			sbRepeticao.append(atividade.getQuinta()!=null && atividade.getQuinta()?" "+context.getString(R.string.thursday_lower)+",":"");
			sbRepeticao.append(atividade.getSexta()!=null && atividade.getSexta()?" "+context.getString(R.string.friday_lower)+",":"");
			sbRepeticao.append(atividade.getSabado()!=null && atividade.getSabado()?" "+context.getString(R.string.saturday_lower)+",":"");
			sbRepeticao.append(atividade.getDomingo()!=null && atividade.getDomingo()?" "+context.getString(R.string.sunday_lower)+",":"");
			linha.append(sbRepeticao.toString().subSequence(0, sbRepeticao.length()-1));
			linha.append(".");
		} else {
			if (!atividade.getPeriodoNotificacao().equals(PeriodoNotificacao.NENHUM)){
				EnumTranslator.translate(atividade.getPeriodoNotificacao(), context);
				linha.append(context.getString(R.string.frequency_lbl)).append(": ").append(atividade.getPeriodoNotificacao().getLabel());
			}
		}
    	return linha.toString();
	}
	
    private String getLinhaPeriodo(Atividade atividade, Context context){
    	StringBuffer linha = new StringBuffer();
    	if (atividade.getDataIni() != null){
			linha.append(context.getString(R.string.msg_activity_start_date_in, util.dateToStringMedium(atividade.getDataIni())));
    	}
		
    	if (atividade.getHoraIni() != null){
    		if (atividade.getDataIni() != null){
    			linha.append(", ").append(util.timeToString(atividade.getHoraIni()));
    		} else {
    			linha.append(context.getString(R.string.msg_activity_start_time_in, util.timeToString(atividade.getHoraIni())));
    		}
    	}

    	if (linha.length() == 0)
    		linha.append(context.getString(R.string.msg_activity_period_not_entered));
		return linha.toString();
    }
	
	private String getTempo(Atividade atividade, Context context){
		StringBuffer linha = new StringBuffer();
		Date data = atividade.getDataVencimento()!=null?atividade.getDataVencimento():atividade.getDataAviso()!=null?atividade.getDataAviso():atividade.getDataIni();
		Date hora = atividade.getHoraAviso()!=null?atividade.getHoraAviso():atividade.getHoraIni();
		if (atividade.getStatus().equals(StatusAtividade.EM_ABERTO)){
			if (atividade.getDataFim() != null){
				if (util.dateToString(atividade.getDataFim()).equals(util.dateToString(new Date()))){
					linha.append("<font color='red'>");
					linha.append(context.getString(R.string.msg_activity_will_be_completed_today));
					linha.append("</font>");
				} else {
					String label = util.getLabelDiffDaysToString(util.dateTimeToDate(atividade.getDataFim()), util.dateTimeToDate(new Date()));
					if (label != null && !label.isEmpty()){
						linha.append("<font color='blue'>");
						linha.append("<b>").append(context.getString(R.string.msg_activity_the_end_approx, label)).append("</b>");
						linha.append("</font>");
					} else {
						label = util.getLabelDiffDaysToString(util.dateTimeToDate(new Date()), util.dateTimeToDate(atividade.getDataFim()));
						linha.append("<font color='red'>");
						linha.append("<b>").append(context.getString(R.string.msg_activity_completed_aprox, label)).append("</b>");
						linha.append("</font>");
					}
				}
			} else {
				if (atividade.getDataIni() == null && atividade.getHoraIni() == null){
		    		linha.append("<font color='blue'>");
		    		linha.append(context.getString(R.string.msg_activity_period_not_entered));
		    		linha.append("</font>");
				} else if ((data != null && util.dateToString(data).equals(util.dateToString(new Date())))){
					linha.append("<font color='blue'>");
					linha.append("<b>").append(context.getString(R.string.msg_activity_for_today)).append("</b>");
					linha.append("</font>");
				} else {
					String label = util.getLabelDiffDaysToString(util.addDateAndTime(data, hora), new Date());
					if (label != null && !label.isEmpty()){
						linha.append("<font color='blue'>");
						linha.append(context.getString(R.string.msg_activity_open_aprox, label));
						linha.append("</font>");
					} else {
						linha.append("<font color='red'>");
						linha.append(util.getLabelDiffDaysToString(new Date(), util.addDateAndTime(data, hora)));
						linha.append(" ").append(context.getString(R.string.group_delayed).toLowerCase()).append(".");
						linha.append("</font>");
					}
				}
			} 
		}
		
		if (atividade.getStatus().equals(StatusAtividade.CONCLUIDA)){
			String label = util.getLabelDiffDaysToString(util.addDateAndTime(atividade.getDataFinalizacao(), atividade.getDataFinalizacao()), new Date());
			linha.append(" ").append(context.getString(R.string.msg_activity_completed_aprox, label));
		}	
			
		return linha.toString();
	}

	@Override
	protected Atividade cursorToEntity() {
		return null;
	}

}
